library(tidyverse)
library(readr)
chic <- read_csv("ggplot2/ggModify/chicago-nmmaps.csv")
chic <- chic %>%
  mutate(year = substr(date, 1, 4))

# 当涉及到 ggplot2} 颜色时，有两个主要的区别。参数color和fill都可以：
#   a. 指定为单色
#   b. 赋值给变量
#   aes内部的变量是由变量编码的，而那些外部的变量是与变量无关的属性。
ggplot(chic, aes(year)) +
  geom_bar(aes(fill = season), color = "grey", size = 2) +
  labs(x = "Year", y = "Observations", fill = "Season:")

# 1. 指定单个颜色
#   静态、单一的颜色使用起啦很简单。我们可以为geom指定一个单一的颜色:
ggplot(chic, aes(x = date, y = temp)) +
  geom_point(color = "steelblue", size = 2) +
  labs(x = "Year", y = "Temperature (°F)")

# 如果同时提供了color(轮廓色)和fill(填充色):
ggplot(chic, aes(x = date, y = temp)) +
  geom_point(shape = 21, size = 2, stroke = 1,
             color = "#3cc08f", fill = "#c08f3c") +
  labs(x = "Year", y = "Temperature (°F)")


# 2.将颜色赋值给变量
#   在ggplot2中，分配给变量的颜色通过scale_color_*和scale_fill_*函数来修改。
#   为了在数据中使用颜色，最重要的是你需要知道你是在处理一个分类变量还是一个连续变量。
#   调色板的选择应取决于变量的类型，连续变量使用顺序调色板或发散调色板，分类变量使用定性调色板:

# 2.1 默认的分类调色板是这样的:
(ga <- ggplot(chic, aes(x = date, y = temp, color = season)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)", color = NULL))

# 你可以选择一组颜色，并通过函数scale_*_manual()将它们分配给一个分类变量
#   (*可以是color, colour，或fill)。
#   指定颜色的数量必须与类别的数量相匹配:
ga + scale_color_manual(values = c("dodgerblue4",
                                   "darkolivegreen4",
                                   "darkorchid3",
                                   "goldenrod1"))

# ColorBrewer调色板是一个为地图选择配色方案的在线工具。
#   不同的颜色组合被设计成三到十二种外观相似的配色方案。
#   这些调色板作为ggplot2包中的内置函数可用，可以通过调用scale_*_brewer()来应用:
ga + scale_color_brewer(palette = "Set1")

# {ggthemes}包允许R用户访问Tableau颜色。
library(ggthemes)
ga + scale_color_tableau()

# ggsci包提供科学杂志和科幻主题的调色板。
library(ggsci)
g1 <- ga + scale_color_aaas()
g2 <- ga + scale_color_npg()

library(patchwork)
(g1 + g2) * theme(legend.position = "top")

# 2.2   连续变量
#   连续变量代表一个可测量的量，因此是数值的。
#   定量数据可以进一步分类为连续(可能是浮点数)或离散(仅整数):

# 在我们的数据集例子中，我们想要着色的变量为ozone，
#   这是一个与温度密切相关的连续变量(更高的温度=更高的臭氧)。
#   函数scale_*_gradient()是一个顺序梯度，而scale_*_gradient2()是发散的。
gb <- ggplot(chic, aes(x = date, y = temp, color = temp)) +
  geom_point() +
  labs(x = "Year", y = "Temperature (°F)", color = "Temperature (°F):")

gb + scale_color_continuous()

# 这是发散的默认配色方案:
mid <- mean(chic$temp)  ## midpoint
gb + scale_color_gradient2(midpoint = mid)

# 3. 修改调色板
#   自从ggplot2 3.0.0的最新版本发布以来，我们可以在图层被映射到数据之后修改图层外观。
#   那么为什么一开始不使用修改过的颜色呢? 由于{ggplot2}只能处理一种color和一种fill的刻度。
library(colorspace)
ggplot(chic, aes(date, temp)) +
  geom_boxplot(aes(color = season,
                   fill = after_scale(desaturate(lighten(color, .6), .6))),
               size = 1) +
  scale_color_brewer(palette = "Dark2", guide = "none") +
  labs(x = "Year", y = "Temperature (°F)")
